#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <dirent.h>

#include "../include/lineaInjector.h"
#include "../include/linea.h"

//para el manejo de señales
static int exitFlag = 0;
static void
exitSigInt(int sign) {
	exitFlag = 1;
}

void
lineaInjector(void) {
	DIR * lineaDir;
	struct dirent * lineaEntry;
	char fileName[30];

	//handler de la señal de mi padre para cerrarme bien
	static struct sigaction act;
	act.sa_handler = exitSigInt;
	sigfillset(&(act.sa_mask));
	sigaction(SIGUSR1, &act, NULL);

	strcpy(fileName, "archivos/lineas/");
	int fileLen = strlen(fileName);

	//abro el directorio de donde voy a sacar las lineas
	if ((lineaDir = opendir(fileName)) == NULL) {
		fprintf(stderr, "No se pudo cargar las lineas de bondis\n");
		exit(1);
	}

	//mientras no me digan de salir, sigo ciclando
	while (!exitFlag) {
		//leo una entrada del directorio
		lineaEntry = readdir(lineaDir);

		//si lei null, me duermo 5 segundos y vuelvo a tratar (sirve si quiero
		//agregar en tiempo de ejecucion nuevas lineas)
		if (lineaEntry == NULL) {
			sleep(5);
		}
		else {
			FILE * lineaArch;
			//anexo el nombre del archivo
			strcpy(&fileName[fileLen], lineaEntry->d_name);
			//me fijo que el archivo no comience con un punto
			if(lineaEntry->d_name[0] != '.') {
				if ((lineaArch = fopen(fileName, "r")) == NULL) {
					fprintf(stderr, "No se pudo cargar la linea %s\n", lineaEntry->d_name);
				}
				else {
					//creo una nueva linea con el archivo de configuracion suyo
					if ( fork() == 0 ) {
						manageLinea(lineaArch);
					}
					fclose(lineaArch);
				}
			}
		}
	}

	closedir(lineaDir);

	exit(1);
}
